package util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.CycleDetectionStrategy;
import util.CustJsonBeanProcessor;


public class JsonUtil {
	public static JSONObject message(String message, boolean success) {
		Map map = new HashMap();
		map.put("success", success);
		map.put("message", message);
		return JSONObject.fromObject(map); 
	}

	/**
	 * 本方法已測試可用
	 * @param list java列表
	 * @param dataFormat 日期格式,如"yyyy-MM-dd HH:mm:ss"
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static String getJsonStringFromPage(Page page,String dataFormat) {
        Map map = new HashMap<String,List>(); 
        map.put("rows", page.getResultList());  
        map.put("total", page.getTotalSize());
        
        JsonConfig jsonConfig = configJson(dataFormat);
        JSONObject json = JSONObject.fromObject(map,jsonConfig);
        
        return json.toString(); 
    }
	
	public static String getJsonStringFromPageWithInfo(Page page,String dataFormat,String info) {
        Map map = new HashMap<String,List>(); 
        map.put("message", info);
        map.put("rows", page.getResultList());
        map.put("total", page.getTotalSize());
        
        JsonConfig jsonConfig = configJson(dataFormat);
        JSONObject json = JSONObject.fromObject(map,jsonConfig);
        
        return json.toString(); 
    }
	
	public static String getJsonStringFromList(List list,String dataFormat){
		Map map = new HashMap<String,List>(); 
        map.put("rows", list);
        map.put("total", list.size());
        JsonConfig jsonConfig = configJson(dataFormat);
        JSONObject json = JSONObject.fromObject(map,jsonConfig);
        
        return json.toString(); 
	}
	
	public static String getJsonStringFromList(List list,Integer totalSize, String dataFormat){
		Map map = new HashMap<String,List>(); 
        map.put("rows", list);
        map.put("total", totalSize);
        JsonConfig jsonConfig = configJson(dataFormat);
        JSONObject json = JSONObject.fromObject(map,jsonConfig);
        
        return json.toString(); 
	}

	
	public static JSONObject javabean2json(Object object, String message, boolean success) { 
		Map map = new HashMap();          
		map.put("success", success);         
		map.put("message", message);       
		map.put("data", object);          
		return JSONObject.fromObject(map); 
	}
	
	public static JSONObject objectcollect2json(List list, String total) {     
		Map map = new HashMap();          
		map.put("totalProperty", total);          
		map.put("rows", list);          
		
		return JSONObject.fromObject(map); 
	}

	public static JSONArray getJSONArrayFormString(String str) {         
		if (str == null || str.trim().length() == 0) {         
			return null;         
		}          
		JSONArray jsonArray = null;       
			
		try {          
			jsonArray = JSONArray.fromObject(str);         
		} catch (JSONException e) {       		
			e.printStackTrace();         	
		}         
		return jsonArray; 
	}
	public static JSONObject StringToJSONOBject(String str) {          
		if (str == null || str.trim().length() == 0) {      
			return null;         
		}         
		JSONObject jsonObject = null;         
		try {          
			jsonObject = JSONObject.fromObject(str);     
		} catch (JSONException e) {       
			e.printStackTrace();          
		}          
		return jsonObject; 
	}
	
	public static JsonConfig configJson(String datePattern) {
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setExcludes(new String[] { "" });
		jsonConfig.setIgnoreDefaultExcludes(false);
		jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
		jsonConfig.registerJsonValueProcessor(Date.class,
				new CustJsonBeanProcessor(datePattern));
		jsonConfig.registerJsonValueProcessor(java.sql.Timestamp.class,
				new CustJsonBeanProcessor(datePattern));

		return jsonConfig;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List list = new ArrayList();
		HashMap m1 = new HashMap();
		HashMap m2 = new HashMap();
		
		m1.put("id", "1");
		m1.put("birth", new Date());
		
		m2.put("id", "2");
		m2.put("birth", new Date());
		
		list.add(m1);
		list.add(m2);
		
		//String json = getJsonStringFromList(list,"yyyy-MM-dd HH:mm:ss");
		//System.out.println(json.toString());
		
	}
	/** */
	/**
	 * 从一个JSON 对象字符格式中得到一个java对象
	 * 
	 * @param jsonString
	 * @param pojoCalss
	 * @return
	 */
	public static Object getObject4JsonString(String jsonString, Class pojoCalss) {
		Object pojo;
		JSONObject jsonObject = JSONObject.fromObject(jsonString);
		pojo = JSONObject.toBean(jsonObject, pojoCalss);
		return pojo;
	}

	/**
	 * 从json HASH表达式中获取一个map，改map支持嵌套功能
	 * 
	 * @param jsonString
	 * @return
	 */
	public static Map getMap4Json(String jsonString) {
		JSONObject jsonObject = JSONObject.fromObject(jsonString);
		Iterator keyIter = jsonObject.keys();
		String key;
		Object value;
		Map valueMap = new HashMap();

		while (keyIter.hasNext()) {
			key = (String) keyIter.next();
			value = jsonObject.get(key);
			valueMap.put(key, value);
		}

		return valueMap;
	}

	public static String getJsonString4Map(Map<?, ?> map) {

		JSONArray jsonArray = JSONArray.fromObject(map);
		return jsonArray.toString();
	}

	public static String getJsonString4List(Collection<?> list) {

		JSONArray jsonArray = JSONArray.fromObject(list);
		return jsonArray.toString();
	}
	
	public static String getJsonString4List(Collection<?> list, JsonConfig jsonConfig) {

		JSONArray jsonArray = JSONArray.fromObject(list,jsonConfig);
		return jsonArray.toString();
	}

	/** */
	/**
	 * 从json数组中得到相应java数组
	 * 
	 * @param jsonString
	 * @return
	 */
	public static Object[] getObjectArray4Json(String jsonString) {
		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		return jsonArray.toArray();

	}

	/**
	 * 从json对象集合表达式中得到一个java对象列表
	 * 
	 * @param jsonString
	 * @param pojoClass
	 * @return
	 */
	public static List getList4Json(String jsonString, Class pojoClass) {

		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		JSONObject jsonObject;
		Object pojoValue;

		List list = new ArrayList();
		for (int i = 0; i < jsonArray.size(); i++) {

			jsonObject = jsonArray.getJSONObject(i);
			pojoValue = JSONObject.toBean(jsonObject, pojoClass);
			list.add(pojoValue);

		}
		return list;

	}

	/** */
	/**
	 * 从json数组中解析出java字符串数组
	 * 
	 * @param jsonString
	 * @return
	 */
	public static String[] getStringArray4Json(String jsonString) {

		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		String[] stringArray = new String[jsonArray.size()];
		for (int i = 0; i < jsonArray.size(); i++) {
			stringArray[i] = jsonArray.getString(i);

		}

		return stringArray;
	}

	/** */
	/**
	 * 从json数组中解析出javaLong型对象数组
	 * 
	 * @param jsonString
	 * @return
	 */
	public static Long[] getLongArray4Json(String jsonString) {

		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		Long[] longArray = new Long[jsonArray.size()];
		for (int i = 0; i < jsonArray.size(); i++) {
			longArray[i] = jsonArray.getLong(i);

		}
		return longArray;
	}

	/** */
	/**
	 * 从json数组中解析出java Integer型对象数组
	 * 
	 * @param jsonString
	 * @return
	 */
	public static Integer[] getIntegerArray4Json(String jsonString) {

		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		Integer[] integerArray = new Integer[jsonArray.size()];
		for (int i = 0; i < jsonArray.size(); i++) {
			integerArray[i] = jsonArray.getInt(i);

		}
		return integerArray;
	}

	/**
	 * 从json数组中解析出java Date 型对象数组，使用本方法必须保证
	 * 
	 * @param jsonString
	 * @return
	 */
	// public static Date[] getDateArray4Json(String jsonString,String
	// DataFormat){
	//                                                                                       
	// JSONArray jsonArray = JSONArray.fromObject(jsonString);
	// Date[] dateArray = new Date[jsonArray.size()];
	// String dateString;
	// Date date;
	//                                                                                       
	// for( int i = 0 ; i<jsonArray.size() ; i++ ){
	// dateString = jsonArray.getString(i);
	// date = DateUtil.stringToDate(dateString, DataFormat);
	// dateArray[i] = date;
	//                                                                                       
	// }
	// return dateArray;
	// }
	/** */
	/**
	 * 从json数组中解析出java Integer型对象数组
	 * 
	 * @param jsonString
	 * @return
	 */
	public static Double[] getDoubleArray4Json(String jsonString) {

		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		Double[] doubleArray = new Double[jsonArray.size()];
		for (int i = 0; i < jsonArray.size(); i++) {
			doubleArray[i] = jsonArray.getDouble(i);

		}
		return doubleArray;
	}

	/** */
	/**
	 * 将java对象转换成json字符串
	 * 
	 * @param javaObj
	 * @return
	 */
	public static String getJsonString4JavaPOJO(Object javaObj) {

		JSONObject json;
		json = JSONObject.fromObject(javaObj);
		return json.toString();

	}

	/**
	 * 将java对象转换成json字符串,并设定日期格式
	 * 
	 * @param javaObj
	 * @param dataFormat
	 * @return
	 */
	public static String getJsonString4JavaPOJO(Object javaObj,
			String dataFormat) {

		JSONObject json;
		JsonConfig jsonConfig = configJson(dataFormat);
		json = JSONObject.fromObject(javaObj, jsonConfig);
		return json.toString();

	}

	/**
	 * 将java对象转换成json字符串,并设定日期格式
	 * 
	 * @param javaObj
	 * @param dataFormat
	 * @return
	 */
	public static String getJsonString4JavaPOJO(Object javaObj,
			String[] excludes, String dataFormat) {

		JSONObject json;
		JsonConfig jsonConfig = configJson(excludes, dataFormat);
		json = JSONObject.fromObject(javaObj, jsonConfig);
		return json.toString();

	}


	/**
	 * 
	 * @param excludes
	 * @param datePattern
	 * @return
	 */
	public static JsonConfig configJson(String[] excludes, String datePattern) {
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setExcludes(excludes);
		jsonConfig.setIgnoreDefaultExcludes(false);
		jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
		jsonConfig.registerJsonValueProcessor(Date.class,
				new CustJsonBeanProcessor(datePattern));

		return jsonConfig;
	}
}
